//
// Created by 罗俊华 on 2022/1/21.
//
#include "my_queue.h"
#include <iostream>

using std::cout;
using std::endl;
using std::cerr;

/**
 * 类中的常量和应用成员变量必须使用此方法来初始化
 * */
Queue::Queue(int size) : queue_size(size) {
    first = last = nullptr;
    count = 0;
}

/**
 * 析构函数
 * */
Queue::~Queue() {
    cout << "queue的析构函数执行，准备释放队列中的剩余元素" << endl;
    for (Node *i = first; i != nullptr;) {

        Node *nextNode = i->getNextNode();
        delete i;
        i = nextNode;
    }
}

bool Queue::isEmpty() const {
    return count == 0;
}

bool Queue::isFull() const {
    return count == queue_size;
}

int Queue::queueCount() const {
    return count;
}

bool Queue::enqueue(const Item &item) {

    if (isFull()) {
        cerr << "队列已满" << count << "个，入队失败" << endl;
        return false;
    }
    count++;
    cout << item << "入队成功，队列中有" << count << "个元素" << endl;

    if (first == nullptr) {
        first = last = new Node(item);
        return true;
    }

    /**
     * 在队列中的最后一个节点（Node）后面添加一个新节点（Node），
     * 新节点中存储元素（item）
     * append() 之后，append()将返回最后一个节点的指针
     * 此时更新 队列的last指针
     * */
    last = last->append(item);// = new Node(item);
    return true;
}

Item Queue::dequeue() {

    if (first == nullptr) {
        cerr << "队列为空，出队失败" << endl;
        return 0;
    }
    Item result = first->getCurrentItem();
    Node *waitingForDelete = first;
    first = first->getNextNode();
    delete waitingForDelete;
    count--;
    cout << result << "出队，队列中有" << count << "个元素" << endl;

    return result;
}